﻿CREATE PROCEDURE [dbo].[WriteOffLinesInsert]
(--списание товара
	@DocId int,
	@PartyId int, --идентификатор списываемой партии. Первично по отношению к @ReturnLineId
	@Qntty int,
	@RetailSum decimal(19, 2),
	@RepriceWriteoffReasonId int, --код причины списания/переоценки
	@RepriceWriteoffReasonText  varchar(50),--причина для кода 4 
	@QualityLossMark varchar(50), --признак понижения качества
	@Note varchar(250),
	@MD datetime,
	@MW varchar(50)
)
AS
DECLARE @strMsg nvarchar(500), @intRet int, @intErrCode int, @intRowCount int, @intNextId int
DECLARE @intDocTypeId int, @datDocDate smalldatetime, @datInputDocDate smalldatetime
DECLARE @ReturnLineId int --идентификатор списываемой строки приходного документа
DECLARE @intInputCount int, @intOutputCount int

SET NOCOUNT ON
IF (@DocId Is Null) OR (@PartyId Is Null) OR (@Qntty Is Null) OR (@RetailSum Is Null)
OR (@RepriceWriteoffReasonId Is Null)
BEGIN
	SELECT @intErrCode = 1, @strMsg = 'Неправильные параметры в вызове процедуры ' + Object_Name(@@Procid) + ' !'
	RAISERROR (@strMsg, 11, 1)
	RETURN @intErrCode
END

IF (@Qntty <=0) OR (@RetailSum <=0)
BEGIN
	SELECT @intErrCode = 2, @strMsg = 'Количество и сумма д.б. больше нуля!'
	RAISERROR (@strMsg, 11, 1)
	RETURN @intErrCode
END

SELECT @intDocTypeId = DocTypeId, @datDocDate = DocDate
FROM [CA].[Documents] WHERE Id = @DocId
IF (@intDocTypeId Is Null)
BEGIN
	SELECT @intErrCode = 3, @strMsg = 'Не найден документ с идентификатором ' + cast(@DocId as varchar(20)) + ' !'
	RAISERROR (@strMsg, 11, 1)
	RETURN @intErrCode
END

IF (@intDocTypeId <> 9)
BEGIN
	SELECT @intErrCode = 4, @strMsg = 'Неправильный тип документа с идентификатором ' + cast(@DocId as varchar(20)) + ' !'
	RAISERROR (@strMsg, 11, @intErrCode)
	RETURN @intErrCode
END

SELECT @ReturnLineId = L.Id, @intDocTypeId = D.DocTypeId, @datInputDocDate = D.DocDate
FROM [CA].[GoodsDocLines] L INNER JOIN CD.Parties P ON L.PartyId = P.Id AND L.DocId = P.DocId
INNER JOIN CA.Documents D ON P.DocId = D.Id
WHERE P.Id = @PartyId

IF @datDocDate < @datInputDocDate 
BEGIN
	SELECT @intErrCode = 5, @strMsg = 'Дата расходного документа меньше даты приходного документа!'
	RAISERROR (@strMsg, 11, 1)
	RETURN @intErrCode
END

--проверка товародвижения
SET @Qntty = 0 - @Qntty
EXEC @intRet = dbo.CheckPartyFlow @PartyId, @Qntty, @datDocDate, @intInputCount OUTPUT, @intOutputCount OUTPUT
IF @intRet <> 0 RETURN @intRet

EXEC [dbo].[ProcessStatistic] @Note OUTPUT, @MD OUTPUT, @MW OUTPUT
--получение значения идентификатора
EXEC @intRet = dbo.GetNextCounterFor 'GoodsLines', @intNextId OUTPUT
IF @intRet <> 0 RETURN @intRet

BEGIN TRAN

INSERT INTO [CA].[GoodsDocLines] (Id, [DocId], [PartyId], [Qntty], [RetailSum], ReturnLineId, [Note], [MD], [MW]) 
VALUES ( @intNextId, @DocId, @PartyId, @Qntty, @RetailSum * (-1.0), @ReturnLineId, @Note, @MD, @MW);

SELECT @intErrCode = @@error, @intRowCount = @@rowcount
IF @intErrCode <> 0 
BEGIN
	IF @@trancount > 0 ROLLBACK TRAN
	RETURN @intErrCode
END
IF (@intRowCount <> 1)
BEGIN
	IF @@trancount > 0 ROLLBACK TRAN
	SELECT @intErrCode = 6, 
	@strMsg = 'Запись в таблицу товародвижения не добавлена!'
	RAISERROR (@strMsg, 11, 1)
	RETURN @intErrCode
END

	SET NOCOUNT OFF;

INSERT INTO CD.RepriceWriteoffLines (Id, [DocId], [PartyId],
GoodsDocLineId, RepriceWriteoffReasonId, RepriceWriteoffReasonText, QualityLossMark,
[Note], [MD], [MW]) 
VALUES ( @intNextId, @DocId, @PartyId, @intNextId, 
@RepriceWriteoffReasonId, @RepriceWriteoffReasonText, @QualityLossMark,
@Note, @MD, @MW);

SELECT @intErrCode = @@error, @intRowCount = @@rowcount

	SET NOCOUNT ON;

IF @intErrCode <> 0 
BEGIN
	IF @@trancount > 0 ROLLBACK TRAN
	RETURN @intErrCode
END
IF (@intRowCount <> 1)
BEGIN
	IF @@trancount > 0 ROLLBACK TRAN
	SELECT @intErrCode = 7, 
	@strMsg = 'Запись в таблицу списания/переоценки не добавлена!'
	RAISERROR (@strMsg, 11, 1)
	RETURN @intErrCode
END

COMMIT TRAN

	SET NOCOUNT OFF;
SELECT Id, DocId, PartyId, Qntty, RetailSum, ReturnLineId, 
GoodsDocLineId, RepriceWriteoffReasonId, RepriceWriteoffReasonName, 
RepriceWriteoffReasonText, QualityLossMark, Note, MD, MW
FROM dbo.vwWriteoffLines WHERE Id = @intNextId
RETURN 0